package com.cskaoyan.javase.oop2._1extends._9override;
/**
 * 方法重写的语法
 * 在讲解具体语法之前,我们先认识一个注解"@Override"
 *      它的作用是: 放在子类重写父类方法的方法头上,用来判断这个方法是否重写子父类
 *      如果是方法重写,就不会编译报错,否者会编译报错
 *
 * 强调:
 *      在Java当中,只要是重写自父类的方法,必须用注解"@Override"注解标记,它有两个好处:
 *              1.它可以标记方法重写,判断是否是重写,避免错误.
 *              2.它可以增加代码可读性
 *
 * 方法重写的语法:
 *      首先对于父类中的成员方法:
 *      [访问权限修饰符] 返回值类型 方法名(形参列表){
 *          // 方法体
 *      }
 *
 * 首先:
 *      1.方法重写,需要继承,所以必须发生在父子类当中的子类中.
 *      2.子类重写父类的方法,访问权限修饰符可以修改吗?
 *          可以修改,但是只能改的更宽松,不能更严格.当然保持一致也是可以的
 *      3.子类重写父类的方法,返回值类型可以修改吗?
 *          可以修改,但是具体是什么样,大家自行测试,作为晚自习的作业.
 *      4.子类重写父类的方法,方法名必须保持一致,不可更改.
 *      5.子类重写父类的方法,形参列表必须保持一致,不可更改.
 *      6.子类重写父类的方法,方法体没有要求,可以保持一致,可以自己写自己的实现.
 *
 *  十年前的面试题:
 *      方法的重载(overload) vs 方法的重写(override)
 *  区别:
 *      1.重载必须在同一个类中,重写必须在两个类中
 *      2.访问权限修饰符不影响重载,但是重写有影响
 *      3.返回值类型不影响重载,但是重写有影响
 *      4.重载要求形参列表必须不同,但是重写要求必须相同
 *
 *  相同点:
 *      1.方法名都要求一致
 *      2.都对方法体的实现没有要求
 *
 *
 * @since 17:13
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        Phone p = new IPhone();
        p.call();
    }
}
class Phone{
    public void call(){
        System.out.println("我用手机打电话!");
    }

    void test2(){}
}
class IPhone extends Phone{
    // call方法是重写自父类的
    @Override
    public void call(){
        System.out.println("嘿siri!");
    }
    @Override
    public void test2(){
    }

    // test方法是子类新增的方法
    // @Override
    public void test(){}
}